import { CONSOLE_REQUEST_ENABLE, CONSOLE_RESPONSE_ENABLE } from '../index'
import { stringify } from 'qs'
import { useUserStore } from '@/store/user'
const userStore = useUserStore()
import { getQueryString } from '@/utils/common'
import { ElLoading, ElMessage } from 'element-plus'
// 判断Content-Type是否是x-www-form-urlencoded 若是需要将参数序列化
function regContentType(config: any) {
  const spReg = /elephant\/api\/public\/auth|order\/address\/save/
  const contentType = config.headers['Content-Type']
  return contentType === undefined || (/x-www-form-urlencoded/.test(contentType) && !spReg.test(config.url))
}
let globalLoading: any = null
export function requestSuccessFunc(config: any) {
  if (!config.noShowLoading) {
    globalLoading = ElLoading.service()
  }
  // 开启请求参数打印
  CONSOLE_REQUEST_ENABLE && console.info('请求参数打印:', `url: ${config.url}`, config)
  const tokenHeader = userStore.user.token
  if (tokenHeader) {
    config.headers.Authorization = `Bearer ${tokenHeader}`
  } else if (getQueryString('t')) {
    config.headers.Authorization = `Bearer ${getQueryString('t')}`
  }
  config.withCredentials = false //让ajax携带cookie

  if (config.noStringify) return config
  // 处理请求体携带参数格式
  const Method = config.method.toLocaleLowerCase()
  if (['post', 'put', 'delete'].includes(Method)) {
    if (regContentType(config)) config.data = stringify(config.data)
  }
  return config
}
export function requestFailFunc(error: any) {
  error && !error.noShowLoading && globalLoading.close()
  error && !error.noShowDefaultError && ElMessage.error(error.message)
  return Promise.reject(error) // 在调用的那边可以拿到(catch)你想返回的错误信息
}
export function responseSuccessFunc(res: any) {
  // 开启请求参数打印
  CONSOLE_RESPONSE_ENABLE && console.info('响应数据打印:', `url: ${res.config.url}`, JSON.parse(res.data))
  const result = JSON.parse(res.data)
  res.config && !res.config.noShowLoading && globalLoading.close()
  if (!res.config.isJava) {
    switch (result.error_code) {
      case 0:
        return result
      default: {
        // 业务中还会有一些特殊 code 逻辑，我们可以在这里做统一处理，也可以下方它们到业务层
        if (result.error_code === '401') {
          // 登录
          userStore.logout()
          window.location.href = '/login'
        } else {
          const msg = result.error_msg || `业务错误:${result.error_code}`
          if (res.config && !res.config.noShowDefaultError) {
            ElMessage.error(msg)
          }
        }
        return Promise.reject(result)
      }
    }
  } else {
    switch (result.code) {
      case '000':
        return result
      default: {
        // 业务中还会有一些特殊 code 逻辑，我们可以在这里做统一处理，也可以下方它们到业务层
        if (result.code === '102') {
          // 登录
          userStore.logout()
          window.location.href = '/login'
        } else {
          const msg = result.msg || `业务错误:${result.code}`
          if (res.config && !res.config.noShowDefaultError) {
            ElMessage.error(msg)
          }
        }
        return Promise.reject(result)
      }
    }
  }
}
export function responseFailFunc(err: any) {
  console.log('responseFailFunc===========================', err)
  if (err && err.response) {
    switch (err.response.status) {
      case 400:
        err.message = '请求错误'
        break

      case 401:
        err.message = '未授权，请登录'
        break

      case 403:
        err.message = '拒绝访问'
        break

      case 404:
        err.message = `请求地址出错: ${err.response.config.url}`
        break

      case 408:
        err.message = '请求超时'
        break

      case 500:
        err.message = '服务器内部错误'
        break

      case 501:
        err.message = '服务未实现'
        break

      case 502:
        err.message = '网关错误'
        break

      case 503:
        err.message = '服务不可用'
        break

      case 504:
        err.message = '网关超时'
        break

      case 505:
        err.message = 'HTTP版本不受支持'
        break

      default:
        err.message = '出现未知错误'
        break
    }
  }
  !err.config.noShowLoading && globalLoading.close()
  err && err.message && ElMessage.error(err.message)
  return Promise.reject(err)
}
